﻿#include "PostGraphObjectBase.h"
#include "PostGraphProperty.h"

#include "FITK_Component/FITKRenderWindowVTK/FITKGraph3DWindowVTK.h"
#include "FITK_Interface/FITKInterfaceCFDPost/FITKAbstractCFDPostData.h"

#include <vtkDataSetMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkProp.h>
#include <vtkScalarBarWidget.h>

#include <QDebug>
namespace Interface {
    PostGraphObjectBase::PostGraphObjectBase(FITKAbstractCFDPostData* postData, Comp::FITKGraph3DWindowVTK* graph3DWidget) :
        Comp::FITKGraphObjectVTK(postData), _postData(postData), _currentWidget(graph3DWidget) {
        if (_postData == nullptr)return;

        _postData->setScalarBarWidgetInteractor(graph3DWidget->getVTKRenderWindow()->GetInteractor());
        _property = new PostGraphProperty(this, _postData);
    }

    PostGraphObjectBase::~PostGraphObjectBase() {
        if (_property) {
            delete _property;
            _property = nullptr;
        }
    }

    void PostGraphObjectBase::create() {
        QList<vtkMapper*> mappers = _postData->getMappers();

        for (vtkMapper* mapper : mappers) {
            if (mapper == nullptr)continue;

            vtkActor* actor = vtkActor::New();
            actor->SetMapper(mapper);
            this->addActor(actor);
        }
    }

    int PostGraphObjectBase::getPostID() {
        if (_postData == nullptr)return -1;

        return _postData->getDataObjectID();
    }

    PostGraphProperty* PostGraphObjectBase::getProperty() {
        return _property;
    }

    QList<vtkProp*> PostGraphObjectBase::getActors() {
        return m_actorList;
    }

    void PostGraphObjectBase::setIsShow(bool isShow) {
        if (_postData == nullptr)return;

        vtkScalarBarWidget* scalarBarWidget = _postData->getScalarBarWidget();

        if (scalarBarWidget == nullptr)return;

        if (isShow == _postData->isEnable())return;

        _postData->enable(isShow);

        //隐藏所有actor
        for (int i = 0; i < m_actorList.size(); i++) {
            vtkProp* actor = m_actorList[i];

            if (isShow) actor->SetVisibility(true);

            else actor->SetVisibility(false);
        }

        //隐藏标量显示界面
        if (isShow) {
            bool scalarBarWidgetShowType = _property->getScalarBarWidgetIsShow();

            if (scalarBarWidgetShowType)scalarBarWidget->On();

            else scalarBarWidget->Off();

        } else {
            scalarBarWidget->Off();
        }
    }

    int PostGraphObjectBase::getRenderLayer() {
        return 0;
    }
}

